package thread;

/**
 * 创建线程-实现Runnable接口
 */
public class Thread02 {

    public static void main(String[] args) {

        /*
            可以实现Runnable接口来创建线程
            例：
            编写程序，可以每隔1秒。在控制台输出“hi”，当输出10次后，自动退出
         */

        T2 t2 = new T2();
        //t2.run(); run只是普通方法，并没有创建线程
        //dog.start(); 这里没法调用start

        //可以创建一个Thread类，把t2对象(实现Runnable)传入Thread
        Thread thread = new Thread(t2);
        thread.start();//使用了代理设计模式

        /*模拟代理模式
        Tiger tiger = new Tiger();//实现了Runnable接口
        ThreadProxy threadProxy = new ThreadProxy(tiger);
        threadProxy.start();*/
    }
}
/* 模拟代理模式
class Animal{}

class Tiger extends Animal implements Runnable{

    @Override
    public void run() {
        System.out.println("老虎嗷嗷叫...");
    }
}

//线程代理类,模拟了一个极简的Thread类
class ThreadProxy implements Runnable {//可以把ThreadProxy类当作Thread

    private Runnable target = null;//属性，类型是 Runnable

    @Override
    public void run() {
        if (target != null) {
            target.run();   //动态绑定 运行类型Tiger
        }
    }

    public ThreadProxy(Runnable target) {
        this.target = target;
    }

    public void start() {
        start0();   // 这个方法是真正实现多线程的方法
    }

    public void start0() {
        run();
    }
}
*/


class T2 implements Runnable {  //通过实现Runnable接口开发线程

    int times = 0;

    @Override
    public void run() { //普通方法

        while (true) {
            System.out.println("hi" + (++times) + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 10) {
                break;
            }
        }
    }
}